void main() {
  var t = add("添加");
  display();

  delete(t);
  display();

  var t2 = add("新任务");
  display();
  t2.name = "已编辑任务";
  edit(t2.id, t2);
  display();

  addLabel(t2, ['公司']);
  display();

  add("task2");
  display();
}

List<Todo> todos = [];

Todo add(String name, {List<String>? labels}) {
  var newTodo = Todo(DateTime.now().microsecondsSinceEpoch, name, DateTime.now(), null,
      labels: labels);
  todos.add(newTodo);
  return newTodo;
}

bool addLabel(Todo todo, List<String> labels) {
  todo.labels.addAll(labels);
  return todo.labels.containsAll(labels);
}

bool edit(int id, Todo todo) {
  Todo ori = todos.singleWhere((element) => element.id == id);
  ori.name = todo.name;
  ori.labels = todo.labels;
  ori.editTime = DateTime.now();
  return true;
}

bool delete(Todo todo) {
  return todos.remove(todo);
}

List<Todo> list() {
  return todos;
}

void display() {
  print(list());
}

class Todo {
  int id;
  String name;
  DateTime startTime;
  DateTime? editTime;
  Set<String> labels = {};

  Todo(this.id, this.name, this.startTime, this.editTime, {labels});

  @override
  String toString() {
    return 'Todo{id: $id, name: $name, startTime: $startTime, editTime: $editTime, labels: $labels}';
  }
}
